package com.luck.securitydemo1.controller;

import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping("/hello")
    public String hello() {
        return "hello security";
    }

    @GetMapping("/index")
    public String index() {
        return "hello index";
    }

    /**
     * 判断是否具有角色，另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“。
     * 使用注解先要开启注解功能！
     *
     * @EnableGlobalMethodSecurity(securedEnabled=true)
     */
    @Secured({"ROLE_sale", "ROLE_manager"})
    @GetMapping("/secured")
    public String secured() {
        return "hello @Secured";
    }

    /**
     * 先开启注解功能：
     *
     * @EnableGlobalMethodSecurity(prePostEnabled = true)
     * @PreAuthorize：注解适合进入方法前的权限验证， @PreAuthorize 可以将登录用
     * 户的 roles/permissions 参数传到方法中。
     */
    @RequestMapping("/preAuthorize")
    @ResponseBody
    @PreAuthorize("hasAnyAuthority('admins')")
    public String preAuthorize() {
        return "hello  @PreAuthorize";
    }

    /**
     * 先开启注解功能：
     * @EnableGlobalMethodSecurity(prePostEnabled = true)
     * @PostAuthorize 注解使用并不多，在方法执行后再进行权限验证，适合验证带有返回值
     * 的权限.
     */
    @RequestMapping("/testPostAuthorize")
    @ResponseBody
    @PostAuthorize("hasAnyAuthority('admin')")
    public String PostAuthorize(){
        System.out.println("管你有没有权限,我都要执行方法");
        return "hello PostAuthorize";
    }



}
